package 移除元素;

public class RemoveElementDemo {
    public static void main(String[] args) {
        /*
        给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
        假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
            更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
            返回 k。
         */
        int[] nums = {0,1,2,2,3,0,4,2};
        int i = removeElemen(nums, 2);
        System.out.println(i);


    }
    public static int removeElemen(int[] nums, int val) {
        // 方法一：
        // 1.遍历数组，利用count(初始化为0)记录nums中有多少个val
        // 2.遍历数组的过程中有两种处理方式
        // 2.1 当值和val相等时,count加一，并且不移动元素
        // 2.2 当值和val不相等,向前移动元素(移动count位)
        // 3.直至遍历到数组的结尾，新的数组长度为 nums.length - count , nums 中不等于val的元素数量为count

//        int count = 0;
//        for (int i = 0; i < nums.length; i++) {
//            if (nums[i] != val)
//                nums[i - count] = nums[i];
//            else
//                count++;
//        }
//        return nums.length - count;

        // 方法二：
        // 这里提一个双指针法
        // 1.遍历数组，一个slow指针指向前N个不存在val值的位置，一个fast指针指向当前数组遍历的位置
        // 2.遍历数组的过程中有两种处理方式
        // 2.1 当值和val相等时,count加一，并且不移动元素
        // 2.2 当值和val不相等,向前移动元素(移动count位)
        // 3.直至遍历到数组的结尾，新的数组长度为 nums.length - count , nums 中不等于val的元素数量为count

        int slow = 0;
        int fast = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;

    }


}
